const fp = require('lodash/fp')
const fs = require('fs')
class IO {
  static of(value) {
    return new IO(function () {
      return value
    })
  }
  constructor(fn) {
    this._value = fn
  }
  map(fn) {
    return new IO(fp.flowRight(fn, this._value))
  }
  join() {
    // 有一个括号!
    // value是一个函数所以直接执行~
    return this._value()
  }
  // map join 联合使用
  flatMap(fn) {
    return this.map(fn).join()
  }
}

let readFile = function (filename) {
  return new IO(function () {
    return fs.readFileSync(filename, 'utf-8')
  })
}
let print = function (x) {
  return new IO(function () {
    console.log(x)
    return x
  })
}
// 使用

let r = readFile('package.json')
  // .map((x) => x.toUpperCase())
  .map(fp.toUpper)
  .flatMap(print)
  .join()
// console.log(r)
